package com.ostrich.cloud.common.result;

import lombok.Data;

import java.util.List;

@Data
public class  PageResult <T> extends Result {

    public static final long DEFAULT_PAGE_SIZE = 10;

    /**
     * 页码
     */
    private long page;
    /**
     * 每页结果数
     */
    private long pageSize;
    /**
     * 总页数
     */
    private long totalPage;
    /**
     * 总数
     */
    private long total;

    /**
     * 元素
     */
    private List<T> elements;

    /**
     * 构造
     */
    public PageResult() {
        this(0, DEFAULT_PAGE_SIZE);
    }

    /**
     * 构造
     *
     * @param page     页码，0表示第一页
     * @param pageSize 每页结果数
     */
    public PageResult(long page, long pageSize) {
        //默认情况下，查询都是成功
        super.setCode(200);
        super.setMsg("分页查询成功");

        this.page = Math.max(page, 0);
        this.pageSize = pageSize <= 0 ? DEFAULT_PAGE_SIZE : pageSize;
    }

    /**
     * 构造
     *
     * @param page     页码，0表示第一页
     * @param pageSize 每页结果数
     * @param total    结果总数
     */
    public PageResult(long page, long pageSize, long total) {
        this(page, pageSize);

        this.total = total;
        this.totalPage = totalPage(total, pageSize);
    }

    /**
     * 构造
     *
     * @param page     页码，0表示第一页
     * @param pageSize 每页结果数
     * @param total    结果总数
     * @param elements  元素
     */
    public PageResult(long page, long pageSize, long total,List<T> elements) {
        this(page, pageSize);

        this.total = total;
        this.totalPage = totalPage(total, pageSize);
        this.elements=elements;
    }

    private static long totalPage(long totalCount, long pageSize) {
        if (pageSize == 0) {
            return 0;
        }
        return totalCount % pageSize == 0 ? (totalCount / pageSize) : (totalCount / pageSize + 1);
    }

    /**
     * @return 是否第一页
     */
    public boolean isFirst() {
        return this.page == 0;
    }

    /**
     * @return 是否最后一页
     */
    public boolean isLast() {
        return this.page >= (this.totalPage - 1);
    }

}
